package common;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.ArrayList;

/**
 * Interfaccia che definisce i metodi chiamabili dal client sul server. Questa e' infatti l'interfaccia che i client che comunicano tramite RMI scaricano sulla loro macchina fisica.
 */
public interface ServerInterface_RMI extends Remote{

	/**
	 * Memorizza e carica sulla propria macchina fisica l'interfaccia del client scaricata tramite l'indirizzo ip passatogli.
	 * @param ip Ip del client dl quale si effettua il lookup.
	 * @param tok Token dell'utente che si e' collegato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public void registrazione(String ip, int tok) throws RemoteException;
	
	/**
	 * Invoca un metodo sulla logica del server permettendo la creazione di un nuovo utente con i dati passatogli.
	 * @param usr Username del nuovo utente.
	 * @param pass Password del nuovo utente.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> creaUtente(String usr, String pass) throws RemoteException;
	
	/**
	 * Metodo usato per permettere alla logica del server di far eseguire il login ad un dato utente.
	 * @param usr Username dell'utente che vuole effettuare il login.
	 * @param pass Password inserita dalli'utente per l'autenticazione da parte del server.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> login(String usr, String pass) throws RemoteException;
	
	/**
	 * Metodo definito per permettere la creazione di una nuova razza.
	 * @param tok Token dell'utente richiedente il servizio.
	 * @param nome Nome della razza che si intende creare.
	 * @param ti Tipo della razza che si vuole creare.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> creaRazza(int tok,String nome,String ti) throws RemoteException;
	
	/**
	 * Metodo che permette l'accesso alla partita corrente all'utente richiedente.
	 * @param tok Token dell'utente richiedente il servizio.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> accessoPartita(int tok) throws RemoteException;
	
	/**
	 * Metodo chiamato per uscire dalla partita corrente.
	 * @param tok Token dell'utente richiedente il servizio.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> uscitaPartita(int tok) throws RemoteException;
	
	/**
	 * Metodo usato per richiedere la lista dei giocatori giocanti nella partita corrente.
	 * @param tok Token dell'utente richiedente il servizio.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> listaGiocatori(int tok) throws RemoteException;
	
	/**
	 * Metodo che restituisce la classifica con le informazioni dei giocatori che hanno partecipato alla partita corrente.
	 * @param tok Token dell'utente richiedente il servizio.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> classifica(int tok) throws RemoteException;
	
	/**
	 * Metodo che permette la disconnessione dal server per tornare alla finestra di login.
	 * @param tok Token dell'utente richiedente il servizio.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> logout(int tok) throws RemoteException;
	
	/**
	 * Metodo usato per richiedere la mappa generale di gioco.
	 * @param tok Token dell'utente richiedente il servizio.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> mappaGenerale(int tok) throws RemoteException;
	
	/**
	 * Metodo invocato per avere la lista dei propri dinosauri attivi al momento dell'invocazione.
	 * @param tok Token dell'utente richiedente il servizio.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> listaDinosauri(int tok) throws RemoteException;
	
	/**
	 * Metodo usato per ricevere la vista locale del dinosauro identificato tramite l'id passato.
	 * @param tok Token dell'utente richiedente il servizio.
	 * @param id Id del dinosauro di cui si vuole effettuare l'azione.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> vistaLocale(int tok, String id) throws RemoteException;
	
	/**
	 * Metodo usato per ricevere le informazioni generali sul dinosauro identificato tramite id.
	 * @param tok Token dell'utente richiedente il servizio.
	 * @param id Id del dinosauro di cui si vuole effettuare l'azione.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> statoDinosauro(int tok, String id) throws RemoteException;
	
	/**
	 * Metodo utilizzato per effettuare lo spostamento di un dinosauro, identificato tramite id.
	 * @param tok Token dell'utente richiedente il servizio.
	 * @param id Id del dinosauro di cui si vuole effettuare l'azione.
	 * @param x Nuova posizione di riga del dinosauro.
	 * @param y Nuova posizione di colonna del dinosauro.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> muoviDinosauro(int tok, String id, int x, int y) throws RemoteException;
	
	/**
	 * Metodo chiamato per far crescere il dinosauro identificato tramite id.
	 * @param tok Token dell'utente richiedente il servizio.
	 * @param id Id del dinosauro di cui si vuole effettuare l'azione.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> cresciDinosauro(int tok, String id) throws RemoteException;
	
	/**
	 * Metodo usato per far deporre un uovo al dinosauro identificato tramite id.
	 * @param tok Token dell'utente richiedente il servizio.
	 * @param id Id del dinosauro di cui si vuole effettuare l'azione.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> deponiUovo(int tok, String id) throws RemoteException;
	
	/**
	 * Metodo chiamato per confermare il turno del giocatore di cui e' il turno.
	 * @param tok Token dell'utente richiedente il servizio.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> confermaTurno(int tok) throws RemoteException;
	
	/**
	 * Metodo chiamato dall'utente di cui e' il turno per passare il turno al giocatore successivo.
	 * @param tok Token dell'utente richiedente il servizio.
	 * @return ArrayList di oggetti contenente informazini relative al metodo invocato.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public ArrayList<Object> passaTurno(int tok) throws RemoteException;
	
	/**
	 * Metodo utilizzato dal server per comunnicare ai client che e' il turno del giocatore corrispondente all'usernae passato.
	 * @param username Nome dell'utente di cui e' il turno corrente.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public void cambioTurno(String username) throws RemoteException;
	
	/**
	 * Metodo chiamato dal client per permettere alla logica del server di cambiare il turno corrente.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public void cambioTurnoPartita() throws RemoteException;
	
	/**
	 * Metodo usato dal server per comunicare ai client che la specie dell'utente identificato tramite il parametro username si e' estinta.
	 * @param username Nome dell'utente a cui e' morta la specie.
	 * @param bul Parametro indicante se la razza estinta e' del giocatore di cui era il turno corrente.
	 * @throws RemoteException Eccezione lanciata in caso di problemi riscontrati sulla connessione.
	 */
	public void specieMorta(String username, Boolean bul) throws RemoteException;
}
